<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #box {
            width: 400px;
            height: 400px;
            background: #ccc;
            font-size: 30px;
        }
    </style>
</head>

<body>
    <div id="box"></div>
    <script>
        let num = 1;
        let content = document.getElementById('box');

        function count() {
            content.innerHTML = num++;
        };
        content.onmousemove = debounce(count, 1000);
        console.log(debounce(count, 1000))


        // 防抖(非立即执行)
        function debounce(func, wait) {
            let timeout;
            return function() {
                let context = this;
                let args = arguments;
                //一直在删除timeout
                if (timeout) clearTimeout(timeout)
                    //最后一次计时，不会清除
                timeout = setTimeout(() => {
                    func.apply(context, args)
                }, wait)
            }
        }

        // 防抖(立即执行)
        // function debounce(func, wait) {
        //     let timeout;
        //     return function () {
        //         let context = this;
        //         let args = arguments;

        //         if (timeout) clearTimeout(timeout);

        //         let callNow = !timeout;
        //         //最后一次不清除，把timeout初始化，准备下次执行
        //         timeout = setTimeout(() => {
        //             timeout = null;
        //         }, wait)
        //         // 第一次会执行
        //         if (callNow) func.apply(context, args)
        //     }
        // }


        // 节流(时间戳版)
        // function throttle(func, wait) {
        //     let previous = 0;
        //     return function () {
        //         let now = Date.now();
        //         let context = this;
        //         let args = arguments;
        //         if (now - previous > wait) {
        //             func.apply(context, args);
        //             previous = now;
        //         }
        //     }
        // }

        // 节流(定时器版)
        // function throttle(func, wait) {
        //     let timeout;
        //     return function () {
        //         let context = this;
        //         let args = arguments;
        //         if (!timeout) {
        //             timeout = setTimeout(() => {
        //                 timeout = null;
        //                 func.apply(context, args)
        //             }, wait)
        //         }

        //     }
        // }
    </script>
</body>

</html>